<?php
/**
 * $Id: index.php 1 2009-07-30 10:06:11Z hainam $
**/
require 'JXwebPanel.php';
require 'krumo/class.krumo.php';
set_time_limit(0);

$ACC = new JXAccounts();
$JXWA = new JXwebPanel();

//$ACC->addUser('hainam@gmail.com', '123abc');
//$ACC->addAccount('trungcacon89', 'hainamttcn82', 's01', 'hainam@gmail.com');
//$ACC->addAccount('hainam82', 'azertyuiop', 's01', 'hainam@gmail.com');
//$ACC->addAccount('alp191', '111111', 's01', 'hainam@gmail.com');
//$ACC->addAccount('nbckcl5', 'qqqqqq', 's01', 'hainam@gmail.com');
//$ACC->save();
//die;

$email = '';
$user = false;

if ($_GET['action'] == 'logout') {
  unset($_GET['account']);
  setcookie('username', '', time()-86400);
  setcookie('password', '', time()-86400);
  Tools::reload();
}
if ($_POST['action']=='Đăng nhập' && $_POST['username'] && $_POST['password']) {
  $password = $ACC->hash($_POST['password']);
  $email = strtolower($_POST['username']);
  if ($user = $ACC->verify($email, $password)) {
    setcookie('username', $email, time()+86400*30);
    setcookie('password', $password, time()+86400*30);
    Tools::reload('Dang nhap thanh cong, dang nap du lieu...');
  }
}
elseif ($_COOKIE['username'] && $_COOKIE['password']) {
  $user = $ACC->verify($_COOKIE['username'], $_COOKIE['password']);
  $email = strtolower($_COOKIE['username']);
}

if (! $user) {
  wrapMessage('login_form');
}

$account = false;
if ($_GET['account']) {
  $accounts = $ACC->getAccounts($email);
  list($login, $server) = explode('.', $_GET['account']);
  foreach ($accounts as $acc) {
    if ($acc['username'] == $login && $acc['server'] == $server) {
      $account = $acc;
    }
  }
  if ($account === false) {
    wrapMessage('Khong tim thay tai khoan');
  }
}

//account actions
if ($_POST['action']=='addAccount' && (count($ACC->getAccounts($email)) < $user['maxAccounts'] || $user['maxAccounts'] == 0)) {
  $ACC->addAccount($_POST['username'], $_POST['password'], $_POST['server'], $email);
  $ACC->save();
  Tools::reload();
}
elseif ($_GET['action']=='delAccount') {
  $ACC->delAccount($login, $server, $acc['email']);
  $ACC->save();
  $_GET['account'] = '';
  Tools::reload();
}

if ($account ===  false) {
  //krumo($ACC);
  wrapMessage('Homepage');
}
else {
  $JXWA->loadUser($account);
  $JXWA->init();

  if (isset($_POST['submit'])) {
    UpdateConfig();
  }
  elseif ($_GET['action'] == 'update') {
    UpdateInfo();
  }
  elseif ($_GET['action'] == 'config') {
    $this->config($_GET['task'], $_GET['op']);
  }
  elseif ($_GET['action'] == 'mail') {
    wrapMessage('displayMail');
  }
  elseif ($_GET['action'] == 'loghk') {
    wrapMessage('viewLog', 'HK');
  }
  elseif ($_POST['action'] == 'Search') {
    SearchVictims();
  }
  else {
    wrapMessage('DisplayInfo');
  }
}

echo $TMPL['footer'];

function Homepage() {
  global $ACC, $TMPL, $email, $user;

  $accounts = $ACC->getAccounts($email);

  echo '<form action="" method="POST"/>
  <h1>Chọn tài khoản để quản lí ('.count($accounts) .'/'. ($user['maxAccounts'] ? $user['maxAccounts'] : 'unlimit') .')</h1><ul>';
  foreach ($accounts as $acc) {
    $link = '?account='. $acc['username'] .'.'. $acc['server'];
    printf('<li><a href="%s">%s</a> (server %s) [<a href="%s">Chiến báo</a> - <a href="%s">Log HK</a>] [<a href="%s">Xoá tài khoản</a>]</li>', $link, $acc['username'], $acc['server'], $link .'&amp;action=mail&amp;p=1', $link .'&amp;action=loghk', $link .'&amp;action=delAccount');
  }
  echo '</ul>';
  
  if (! $user['options']) {
    $user['options'] = array(
      'mr_check' => true,
      'mr_open' => array(1, 2, 3),
      'ltt_check' => true,
      'ltt_open' => array(1, 2),
      'mr_sell' => false,
      'mr_price' => array(1=>1, 2=>1),
      'hr_sell' => true,
      'hr_price' => array(1=>1, 2=>2),
      'ltt_sell' => true,
      'ltt_price' => array(1=>1, 2=>1),
    );
  }
  $opt = $user['options'];

  echo '<fieldset><legend>Định giá vật phẩm</legend>'.
  renderCheckbox('mr_check', $opt['mr_check'], 'Mở mộc rương cấp ') .
  renderTextbox('mr_open', implode(', ', $opt['mr_open']), 200) .'<br />'.
  renderCheckbox('ltt_check', $opt['ltt_check'], 'Tháo LTT từ trang bị cấp ') .
  renderTextbox('ltt_open', implode(', ', $opt['ltt_open']), 200) .'<br />'.
  renderCheckbox('mr_sell', $opt['mr_sell'], 'Bán MR với giá') .
  renderTextbox('mr_price', renderPrice($opt['mr_price']), 200) .'<br />'.
  renderCheckbox('hr_sell', $opt['hr_sell'], 'Bán HR với giá ') .
  renderTextbox('hr_price', renderPrice($opt['hr_price']), 200) .'<br />'.
  renderCheckbox('ltt_sell', $opt['ltt_sell'], 'Bán LTT với giá ') .
  renderTextbox('ltt_price', renderPrice($opt['ltt_price']), 200) .'<br />
  <input type="submit" name="action" value="savePrice"/>
  </fieldset>';

  echo '<fieldset><legend>Thêm tài khoản mới</legend>
    Tên đăng nhập <input type="text" name="username"/><br/>
    Mật khẩu <input type="password" name="password"/><br/>
    Máy chủ '. renderOptions('server', $TMPL['servers']) .'<br/>
    <input type="submit" name="action" value="addAccount"/>
    <input type="reset" value="Reset"/>
  </fieldset>';
  
  echo '</form>';
}

function DisplayInfo() {
	global $JXWA, $TMPL;
  
  echo '<div><a href="?account='. $_GET['account'] . '&amp;action=update">Cập nhật</a> - <a href="?account='. $_GET['account'] . '&amp;action=mail&amp;p=1">Chiến báo</a></div>';

  printf('<p>Máy chủ: <b>%s</b>. Người chơi: <b>%s</b>. Thôn trấn: <b>%s</b> %s. Bang hội: <b>%s</b>.</p>',
         $JXWA->user['server'],
         $JXWA->config['UserInfo']['Name'],
         $JXWA->config['UserInfo']['CityName'],
         renderPos($JXWA->config['UserInfo']['CityPos']),
         $JXWA->config['UserInfo']['Organise']
  );
  
  $CityInfo = $JXWA->config['CityInfo'];
  printf('%s %d/%d &nbsp; %s %d/%d &nbsp; %s %d/%d',
    renderImg('/4/1.gif'), $CityInfo['Money'], $CityInfo['MoneyRoom'],
    renderImg('/4/2.gif'), $CityInfo['Food'], $CityInfo['FoodRoom'],
    renderImg('/4/3.gif'), $CityInfo['Men'], $CityInfo['MenRoom']
  );

  $HKTitle = array('Tên', 'Môn phái', 'Cấp', 'Đệ tử', 'Sĩ khí', 'Trạng thái', 'Nhóm');
  $HKData = array();
  foreach ($JXWA->config['HeroInfo'] as $Hero) {
    $HKData[] = array(
      renderHero($Hero['Name'], $Hero['Quality']) . sprintf(' (%d/%d)', $Hero['CrushBlow'], $Hero['Dodge']),
      $TMPL['Junta'][$Hero['Junta']],
      $Hero['Level'],
      sprintf('%d/%d', $Hero['PrenticeNum'], $Hero['MaxPrenticeNum']),
      $Hero['Training'] . '%',
      $TMPL['HeroState'][$Hero['State']-1] . renderImg($TMPL['HeroList'][$Hero['ListType']-1]),
      renderOptions('group_'.$Hero['ID'], array(1=>1, 2=>2, 3=>3), opt('group_'.$Hero['ID'])), 
    );
  }

  $BTitle = array('Tên', 'Cấp', 'Chọn');
  $BData = array();
  foreach ($JXWA->config['Buildings'] as $b) {
    if ($b !== false) {
      $BData[] = array($b['Name'], $b['Level'], renderCheckbox('b_'.$b['ID'], opt('b_'.$b['ID'])));
    }
  }

  $group = array(
    '5' => '5 và 0',
    '4' => '4 và 1',
    '3' => '3 và 2',
    '2' => '2 và 3',
    '-1' => 'Linh động',
  );
  
  $training = array(
    '100' => '100%',
    '95'  => '95%',
    '90'  => '90%',
    '85'  => '85%',
  );
  
  $nhiemvu = array(
    'tn' => 'thường nhật',
    'tr' => 'thợ rèn',
  );
  
  $repair = array(
    'bt' => 'Sửa bình thường',
    'tim' => 'Sửa kĩ đồ tím',
    'all' => 'Sửa kĩ tất cả', 
  );
  
  echo '
  <form action="" method="POST">'. renderCheckbox('enabled', opt('enabled'), 'Kích hoạt auto cho tài khoản này.') .'
  <fieldset>
    <legend>'. renderCheckbox('op_xuattran', opt('op_xuattran'), 'Xuất trận') .'</legend>
    '. renderRadio('xuattran', 'level', opt('xuattran'), 'Luyện level tại toạ độ: ') . renderTextbox('level_pos', renderPos(opt('level_pos')), 50) .' Tự động tìm ST '. renderSTLevel('level_lv', opt('level_lv')) .'<br/>
    '. renderRadio('xuattran', 'skill', opt('xuattran'), 'Luyện skill tại toạ độ: ') . renderTextbox('skill_pos', renderPos(opt('skill_pos')), 50) .' Tự động tìm ST '. renderSTLevel('skill_lv', opt('skill_lv')) .' Chỉ do thám tầng '. renderTextbox('skill_min', opt('skill_min', 4), 20) .'/'. renderTextbox('skill_max', opt('skill_max', 4), 20) .'<br/>
    '. renderRadio('xuattran', 'attack', opt('xuattran'), 'Cướp theo danh sách: ') . renderTextbox('attack_pos', renderPos(array_keys(opt('attack_pos', array()))), '99%') . '<br />
    <fieldset>
    <legend>Tự động tìm nạn nhân</legend>
    Đẳng cấp '. renderTextbox('attack_min', opt('attack_min', 2), 20) .'/'. renderTextbox('attack_max', opt('attack_max', 7), 20) .' &nbsp; Thời gian đi tối đa '. renderTextbox('attack_time', opt('attack_time',10), 25) .' phút.<br/>
    Bỏ qua không cướp '. renderTextbox('attack_exclude', renderPos(opt('attack_exclude')), 250) .'<br/>
    <div class="note">Chương trình chỉ tìm trong phạm vi 13 ô ngang dọc (tức là trong bản đồ chính và 8 bản đồ chung quanh). Sau khi tìm sẽ xoá các toạ độ “bỏ qua” và xoá những người chơi cùng bang. Kết quả nhận được sẽ thay thế danh sách hiện có.</div>
    <input type="submit" name="action" value="Search"/>
    </fieldset>
    <fieldset>
    <legend>'. renderCheckbox('op_switch', opt('op_switch'), 'Tự động đổi đội hình') .'</legend>
    <p>Khi tiến hành luyện level hoặc luyện skill, nhóm 1 và 2 sẽ đánh chủ lực. Khi hai nhóm này không đủ 5 HK sẵn sàng, nhóm 3 sẽ đi cướp bóc trong lúc chờ đợi. Nhóm 3 này sẽ tính toán để không về sau khi nhóm 1, 2 sẵn sàng hơn '. renderTextbox('wait', opt('wait', 5), 30) .' phút. Khi chiêu mộ, huấn luyện, nhóm 1 sẽ max đệ tử, max sĩ khí, nhóm 2 sẽ có 3 đệ tử còn nhóm 3 sẽ max đệ tử (không quan tâm sĩ khí).</p>
    <p>Số thành viên nhóm 1 và 2 là '. renderOptions('group', $group, opt('group')) .'. Khi thiết lập số thành viên nhóm 1 và 2 là “Linh động”, chương trình sẽ tự tính toán thực lực hiện tại, số tầng hiện tại để chọn số lượng phù hợp nhất.</p>
    <div class="note">Thông thường có các cách chơi như sau:
      <ul>
      <li>Luyện level, luyện skill thông thường với 5 HK chính: chế độ 5-0 và 5 HK nhóm 3 để cướp trong lúc chờ đợi. Cách này vừa luyện cấp lẫn luyện skill, mà vẫn có thu nhập, săn được hắc rương.</li>
      <li>HK châu Phi kéo level, skill cho HK xịn cấp thấp: chế độ 2-3 hoặc linh động (chưa làm). 5 HK cao nhóm 1 và 5 HK thấp nhóm 2. Không có nhóm cướp. Cách này không có thu nhập (vật phẩm, tài nguyên), bù lại lên cấp và skill nhanh.</li>
      <li>[chưa làm] Khi chế độ đánh chính là cướp, sẽ tự chiêu mộ, huấn luyện HK ở nhóm 1, đồng thời lựa ra 5 HK nhiều đệ nhất (nhóm bất kì) để cướp.</li>
      </ul>
    </div>
    '. renderTable('', $HKTitle, $HKData) .'
    </fieldset>
  </fieldset>
  <fieldset>
    <legend>'. renderCheckbox('op_thuthap', opt('op_thuthap'), 'Thu thập') .'</legend>
    <p>Tự động làm nv thu thập (mỗi 30 phút mất 15 dân)</p>
    Toạ độ '. renderTextbox('thuthap_pos', renderPos(opt('thuthap_pos')), 50) .' (nếu để trống sẽ tự chọn toạ độ)
  </fieldset>
  <fieldset>
    <legend>'. renderCheckbox('op_nhiemvu', opt('op_nhiemvu'), 'Làm nhiệm vụ (chua hoan thanh)') .'</legend>
    <p>Tự động tìm và làm nhiệm vụ '. renderOptions('nhiemvu', $nhiemvu, opt('nhiemvu')) .'</p>
    <p>'. renderCheckbox('tr_quick', opt('tr_quick'), 'Tìm nhanh (nhiệm vụ thợ rèn)') .'</p>
    <div class="note">Chương trình tự thu thập và làm nhiệm vụ thường nhật hoặc thợ rèn. Mục tiêu của nv thường nhật là tìm thanh thủy tinh (theo giá ghi ở cấu hình chung). Mục tiêu của nhiệm vụ thợ rèn là tìm lam tt cấp 1, nâng cấp lam tt (cấp 2,3,4) bằng cách ghép hai lam tt, tìm trang bị lam theo yêu cầu.</div>
  </fieldset>
  <fieldset>
    <legend>'. renderCheckbox('op_hoitham', opt('op_hoitham'), 'Hỏi thăm HK') .'</legend>'.
  renderCheckbox('hoitham_quick', opt('hoitham_quick'), 'Hỏi thăm nhanh (5 xu)') .
  renderTable('', $BTitle, $BData) .'
    <p>Chất lượng '. renderOptions('ht_quality', array_combine(range(1,5), $TMPL['HeroQuality']), opt('ht_quality')) .' &nbsp; Công/phòng '. renderTextbox('ht_attack', opt('ht_attack', 0), 30) .' &nbsp; Né/bạo '. renderTextbox('ht_dodge', opt('ht_dodge', 0), 30) . ' &nbsp; SL đệ tử '. renderTextbox('ht_prentice', opt('ht_prentice', 0), 30) .'
  </fieldset>
  <fieldset>
    <legend>Tuỳ chọn khác</legend>
      '. renderCheckbox('op_bch', opt('op_bch'), 'Tự động sử dụng BCH', true) .'<br />
      '. renderCheckbox('op_bqtt', opt('op_bqtt'), 'Tự động sử dụng BQTT', true) .'<br />
      '. renderCheckbox('op_tcn', opt('op_tcn'), 'Dùng “tấn công nhanh” (20 xu, tốc độ x5) khi đi lâu hơn ') . renderTextbox('op_tcn_time', opt('op_tcn_time', 600), 30) .' phút<br />
      '. renderCheckbox('op_thn', opt('op_thn'), 'Dùng “triệu hồi nhanh” khi đi lâu hơn ') . renderTextbox('op_thn_time', opt('op_thn_time', 20), 30) .' phút<br />
      '. renderCheckbox('op_cmn', opt('op_cmn'), 'Dùng chiêu mộ nhanh', true) .'<br />
      '. renderCheckbox('op_hln', opt('op_hln'), 'Dùng huấn luyện nhanh', true) .'<br />
      '. renderCheckbox('op_sell', opt('op_sell'), 'Tự sử dụng, tháo, bán hàng theo tùy chọn chung', true) .'<br />
      '. renderCheckbox('repair', opt('repair'), 'Tự sửa đồ theo tùy chọn ') . renderOptions('repair_opt', $repair, opt('repair_opt', 'tim')) .'<br />
      '. renderCheckbox('op_bophong', opt('op_bophong'), 'Tự động bố phòng') .' <br />
      &nbsp; &nbsp; Tường thành '. renderTextbox('bp[1]', opt('bp[1]', 0), 20) .' Hào '. renderTextbox('bp[2]', opt('bp[2]', 0), 20) .' Bẫy '. renderTextbox('bp[3]', opt('bp[3]', 0), 20) .' Cồn mộc '. renderTextbox('op_bp[4]', opt('bp[4]', 0), 20) .' Lôi thạch '. renderTextbox('bp[5]', opt('bp[5]', 0), 20) .' Tiễn tháp '. renderTextbox('bp[6]', opt('bp[6]', 0), 20) .'<br />
      &nbsp; &nbsp; Hủy bố phòng HK khi bị tấn công bởi '. renderTextbox('owner', opt('owner'), 100) .'
  </fieldset>
  <input type="submit" name="submit" value="Lưu cấu hình"/>
  <input type="reset" value="Làm lại"/>
  </form>
  ';
  krumo($JXWA->config);
}

function doUpdateConfig() {
  global $JXWA, $ACC;
  
  $JXWA->config['options'] = array(
    'enabled' => $_POST['enabled'],
    'op_xuattran' => $_POST['op_xuattran'],
    'op_thuthap' => $_POST['op_thuthap'],
    'op_hoitham' => $_POST['op_hoitham'],
    'op_nhiemvu' => $_POST['op_nhiemvu'],
    'op_switch' => $_POST['op_switch'],
    'op_bophong' => $_POST['op_bophong'],
    'op_bch' => $_POST['op_bch'],
    'op_bqtt' => $_POST['op_bqtt'],
    'op_thn' => $_POST['op_thn'],
    'op_thn_time' => intval($_POST['op_thn_time']),
    'op_tcn' => $_POST['op_tcn'],
    'op_tcn_time' => intval($_POST['op_tcn_time']),
    'op_cmn' => $_POST['op_cmn'],
    'op_hln' => $_POST['op_hln'],
    'op_hpn' => $_POST['op_hpn'],
    'op_sell' => $_POST['op_sell'],
    'xuattran' => $_POST['xuattran'],
    'level_lv' => intval($_POST['level_lv']),
    'level_pos' => derenderPos($_POST['level_pos']),
    'skill_lv' => intval($_POST['skill_lv']),
    'skill_pos' => derenderPos($_POST['skill_pos']),
    'skill_min' => intval($_POST['skill_min']),
    'skill_max' => intval($_POST['skill_max']),
    'attack_time' => intval($_POST['attack_time']),
    'attack_min' => intval($_POST['attack_min']),
    'attack_max' => intval($_POST['attack_max']),
    'attack_pos' => generateVictims($_POST['attack_pos']),
    'attack_exclude' => derenderPos($_POST['attack_exclude']),
    'wait' => intval($_POST['wait']),
    'group' => intval($_POST['group']),
    'thuthap_pos' => derenderPos($_POST['thuthap_pos']),
    'nhiemvu' => $_POST['nhiemvu'],
    'tr_quick' => $_POST['tr_quick'],
    'hoitham_quick' => $_POST['hoitham_quick'],
    'ht_quality' => $_POST['ht_quality'],
    'ht_dodge' => intval($_POST['ht_dodge']),
    'ht_attack' => intval($_POST['ht_attack']),
    'ht_prentice' => intval($_POST['ht_prentice']),
    'owner' => $_POST['owner'],
    'repair' => $_POST['repair'],
    'repair_opt' => $_POST['repair_opt'],
  );

  foreach ($JXWA->config['HeroInfo'] as $Hero) {
    $JXWA->config['options']['group_'.$Hero['ID']] = intval($_POST['group_'.$Hero['ID']]);
  }

  foreach ($JXWA->config['Buildings'] as $b) {
    if ($b !== false) {
      $JXWA->config['options']['b_'.$b['ID']] = $_POST['b_'.$b['ID']];
    }
  }
  
  $JXWA->config['options']['bp'] = array();
  for ($k=1; $k<=6; $k++) {
    $JXWA->config['options']['bp'][$k] = intval($_POST['bp'][$k]);
  }
}

function UpdateConfig() {
  global $JXWA, $ACC;
  doUpdateConfig();
  $JXWA->updateUserInfo(true);
  $JXWA->saveConfig();
  $ACC->updateAccount($JXWA);
  Tools::reload();
}

function UpdateInfo() {
  global $JXWA;
  $JXWA->updateUserInfo(true);
  Tools::reload();
}

function SearchVictims() {
  global $JXWA;
  doUpdateConfig();
  $JXWA->config['options']['attack_pos'] = $JXWA->getVictimsInfo();
  $JXWA->saveConfig();
  Tools::reload();
}

function displayMail($type = 2) {
  global $JXWA;
  
  $result = ajax_GetMailNum($type);
  $data = Tools::decode($result->data);
  
  $p = intval($_GET['p']);
  if ($p >= 1 && $p <= $data[2]) {
    $start = $p;
    $end = $p;
  }
  else {
    $start = 1;
    $end = $data[2];
  }
  
  for ($k=$start; $k<=$end; $k++) {
    $result = ajax_GetMailByType($type, $k);
    $data = Tools::decode($result->data);
    foreach ($data as $mail) {
      if ($mail->MailType == 2) {
        $tmp = Tools::decode($JXWA->getMailByID($mail->MailID));
        echo renderFightMail($tmp);
      }
      else {
        echo 'mailtype != 2';
      }
    }    
  }
}

function wrapMessage($func) {
  global $TMPL;
  if (function_exists($func)) {// it's a function name
    ob_start();
    $params = func_get_args();
    call_user_func_array($func, array_slice($params, 1));
    $msg = ob_get_contents();
    ob_end_clean();
  }
  else if (isset($TMPL[$func])) {
    $msg = $TMPL[$func];
  }
  else {
    $msg = "<center><strong>$func</strong></center>";
  }
  
  echo $TMPL['header'] . $msg . $TMPL['footer'];
  die;
}

function opt($name, $default = '') {
  global $JXWA;
  if (preg_match('/([a-z0-9]+)\[([a-z0-9]+)\]/', $name, $match)) {
    $name = $match[1];
    $key = $match[2];
    return empty($JXWA->config['options'][$name][$key]) ? $default : $JXWA->config['options'][$name][$key];
  }
  else {
    return empty($JXWA->config['options'][$name]) ? $default : $JXWA->config['options'][$name];    
  }
}
